// 定义一个模拟异步操作的函数，它返回一个Promise对象
function doSomethingAsync(value) {
    return new Promise(resolve => {
        setTimeout(() => {
            console.log(`value: ${value}`);
            resolve(value * 2);
        }, Math.random() * 1000);
    });
}

// 定义一个数组，包含需要串行处理的数据
const data = [1, 2, 3, 4, 5];

// 定义一个Promise串行处理的函数
function series(items, fn) {
    // promise作为reduce里的累加器 return promise.then(() => fn(item))即是串行了
    return items.reduce((promise, item) => {
        return promise.then(() => fn(item));
    }, Promise.resolve());
}

// 使用series函数串行处理数据
series(data, doSomethingAsync).then(results => {
    // 由于每次进去都是一个指定的数 所以这里的结果是最后一个数*2
    console.log('All done:', results);
});
